﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Ext.Net;
using ENT.GP.Core.Proyecto;
using ENT.GP.Core.Lookup;
using ENT.GP.Core;
using ENT.GP.Core.Core;
using entgp.Code;

namespace entgp.Proyectos.Seguimiento
{
    public partial class wucSeguimiento : ControlesUsuario
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {


                TipoLookup.InvalidateCache();
                EjesLookup.InvalidateCache();
                ProgramaLookup.InvalidateCache();
                EstadoProyectoLookup.InvalidateCache();
                IndicadoresLookup.InvalidateCache();
                EntidadLookup.InvalidateCache();
                RegionLookup.InvalidateCache();
                SectorLookup.InvalidateCache();
                PoblacionAfectadaLookup.InvalidateCache();

                sPoblacionAfectada.DataSource = PoblacionAfectadaLookup.GetNameValueList(IdEmp);
                sPoblacionAfectada.DataBind();

                sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString(), this.IdEmp);
                sRegion.DataBind();
                sSectores.DataSource = SectorLookup.GetNameValueList(this.IdEmp);
                sSectores.DataBind();
                sTipo.DataSource = TipoLookup.GetNameValueList(this.IdEmp);
                sTipo.DataBind();
                sEstadoProyecto.DataSource = EstadoProyectoLookup.GetNameValueList(this.IdEmp);
                sEstadoProyecto.DataBind();
                sEjes.DataSource = EjesLookup.GetNameValueList(this.IdEmp);
                sEjes.DataBind();
                sPrograma.DataSource = ProgramaLookup.GetNameValueList(this.IdEmp);
                sPrograma.DataBind();
                //
                cbxEjes.FieldLabel = ManejadorRecursos.GetRecurso("LblEje");
                cbxPrograma.FieldLabel = ManejadorRecursos.GetRecurso("LblPrograma");

            }
        }

        internal void Show(int idProy)
        {
            hidIdProyecto.Text = idProy.ToString();
            CargarDatos(idProy);
            winProyectos.Show();
        }
        /// <summary>
        /// Cargar los datos del proyecto
        /// </summary>
        /// <param name="Id"></param>
        void CargarDatos(int Id)
        {
            Proyecto objProyecto = Proyecto.GetProyecto(Id);
            DateTime fi, ff;
            DateTime.TryParse(objProyecto.FechaInicio.ToString(), out fi);
            DateTime.TryParse(objProyecto.FechaFin.ToString(), out ff);
            dFechaDesde.SelectedDate = fi;
            dFechaHasta.SelectedDate = ff;
            txtDuracionProy.SetValue(objProyecto.DuracionProy);
            txtNombreProyecto.SetValue(objProyecto.Nombre);
            txaDescripcion.SetValue(objProyecto.DescripcionAdicional);
            cbxTipo.SetValue(objProyecto.Tipo);
            cbxEjes.SetValue(objProyecto.Eje);
            cbxPrograma.SetValue(objProyecto.Programa);
            cbxEstadoProy.SetValueAndFireSelect(objProyecto.Estado);
            nfPorcentajeA.Text = objProyecto.PorcentajeAvance.ToString();
            txtObEstado.Text = objProyecto.Observacion;
            txtObjGeneral.Text = objProyecto.ObjetivoGeneral;
            txtObjEspecifico.Text = objProyecto.ObjetivoEspecifico;
            int valorAvance;
            int.TryParse(objProyecto.PorcentajeAvance.ToString(), out valorAvance);
            sliPorcentaje.Value = valorAvance;
            //Localizacion

            txtLatitud.Number = (objProyecto.Latitud);
            txtLongitud.Number = (objProyecto.Longitud);
            nfPorcentajeA.Text = objProyecto.PorcentajeAvance.ToString();

            sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString(), this.IdEmp);
            sRegion.DataBind();
            CargarProvincias(objProyecto.Region);
            CargarCantones(objProyecto.Provincia);
            cbxRegion.SetValue(objProyecto.Region);
            cbxProvincia.SetValue(objProyecto.Provincia);
            cbxCanton.SetValue(objProyecto.Canton);
            txtParroquia.Text = (objProyecto.Parroquia);
            sPoblacionAfectada.DataSource = PoblacionAfectadaLookup.GetNameValueList(IdEmp);
            sPoblacionAfectada.DataBind();
            cbxPoblacionAfectada.SetValue(objProyecto.PoblacionAfectada);
            
            
            sAvances.DataSource = objProyecto.Avances;
            sAvances.DataBind();
            sProyectoEstados.DataSource = objProyecto.Estados;
            sProyectoEstados.DataBind();
            sCoordinacion.DataSource = objProyecto.Coordinadores;
            sCoordinacion.DataBind();
            StoreSector.RemoveAll();
            StoreSector.DataSource = objProyecto.Sectores;
            StoreSector.DataBind();
            sSectores.RemoveAll();
            sSectores.DataSource = SectorLookup.GetNameValueList(this.IdEmp);
            sSectores.DataBind();
            X.Js.Call("MarcarSectores");
            string urlUbicacion = string.Format("{0}Georeferencial/UbicacionMapa.aspx?IdP={1}", ConfigurationManager.AppSettings.Get("PathServer"), Id);

            pnlMapa.LoadContent(urlUbicacion);
        }

        private void CargarCantones(int Id)
        {
            CantonLookup.InvalidateCache();
            this.sCanton.DataSource = CantonLookup.GetNameValueList(Id);
            this.sCanton.DataBind();
        }

        private void CargarProvincias(int Id)
        {
            ProvinciaLookup.InvalidateCache();
            this.sProvincia.DataSource = ProvinciaLookup.GetNameValueList(Id);
            this.sProvincia.DataBind();
        }
        /// <summary>
        /// Invoca metodo para actualizar datos de la grid
        /// </summary>
        private static void CallRefreshGridParent()
        {
            X.Js.AddScript("#{StoreProyectos}.load();");
        }
        protected void btnGuardar_Click(object sender, DirectEventArgs e)
        {
            string opcion = e.ExtraParams["Opcion"];
            int IdProy = Convert.ToInt32(e.ExtraParams["hidIdProyecto_prm"]);//hidIdProyecto.Text
            var proyecto = Proyecto.GetProyecto(IdProy);
            try
            {
                
                switch (opcion)
                {
                    case "Estado":
                        int idEstado;
                int.TryParse(e.ExtraParams["idEstado_prm"], out idEstado);//cbxEstadoProy.SelectedItem.Value
                
                proyecto.Estado = idEstado;
                proyecto.Observacion = e.ExtraParams["Observacion_prm"];//txtObEstado.Text
                        string jsonEstados = e.ExtraParams["Estados"];
                        //Proyecto Estados
                        StoreDataHandler sdhEstados = new StoreDataHandler(jsonEstados);
                        ChangeRecords<ProyectoEstado> crsdhEstados = sdhEstados.ObjectData<ProyectoEstado>();

                        foreach (var estado in crsdhEstados.Deleted)
                        {
                            int indice = proyecto.Estados.IndexOf(proyecto.Estados.FirstOrDefault(x => x.Id == estado.Id));
                            if( indice !=-1)
                                 proyecto.Estados.RemoveAt(indice);
                        }

                        foreach (var estado in crsdhEstados.Updated)
                        {
                            int indice = proyecto.Estados.IndexOf(proyecto.Estados.FirstOrDefault(x => x.Id == estado.Id));
                            Csla.Data.DataMapper.Map(estado, proyecto.Estados[indice]);
                        }

                        foreach (var estado in crsdhEstados.Created)
                        {
                            proyecto.Estados.Add(estado);
                        }
                        break;
                    case "Avance":
                        string jsonAvances = e.ExtraParams["Avances"];
                        double av;
                        double.TryParse(e.ExtraParams["PorcentajeAvance_prm"], out av);
                        proyecto.PorcentajeAvance =av;//nfPorcentajeA.Number
                        //Proyecto Avances
                        StoreDataHandler sdhAvances = new StoreDataHandler(jsonAvances);
                        ChangeRecords<ProyectoAvance> crsdhAvances = sdhAvances.ObjectData<ProyectoAvance>();

                        foreach (var avance in crsdhAvances.Deleted)
                        {
                            int indice = proyecto.Avances.IndexOf(proyecto.Avances.FirstOrDefault(x => x.Id == avance.Id));
                            if (indice != -1)
                                proyecto.Avances.RemoveAt(indice);
                        }

                        foreach (var avance in crsdhAvances.Updated)
                        {
                            int indice = proyecto.Avances.IndexOf(proyecto.Avances.FirstOrDefault(x => x.Id == avance.Id));
                            Csla.Data.DataMapper.Map(avance, proyecto.Avances[indice]);
                        }

                        foreach (var avance in crsdhAvances.Created)
                        {
                            proyecto.Avances.Add(avance);
                        }
                        break;
                    default:
                        break;
                }
                proyecto = proyecto.Save();
                sAvances.DataSource = proyecto.Avances;
                sAvances.DataBind();
                sProyectoEstados.DataSource = proyecto.Estados;
                sProyectoEstados.DataBind();
                //((Proyectos_Seguimiento_WiewProyecto)this.Page).BindDataSearch();
                CallRefreshGridParent();
                e.Success = true;
            }
            catch (Exception ex)
            {
                e.Success = false;
                Util.RegistarLog(ex.ToString());
            }
        }
    }
}